#ifndef SEMAFORO_H_
#define SEMAFORO_H_

#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <string>

#include <Constantes.h>

class Semaforo {

private:
	int m_Id;
	std::string m_NombreSemaforo;

	void getSem( const std::string& nombre, bool crearSiNoExiste, const char projectId);
	int inicializar( const int valorInicial ) const;

public:
	/** Crea un clase semaforo */
	Semaforo ();
	/** Crea un semaforo nuevo */
	Semaforo ( const std::string& nombre, const int valorInicial, const char projectId = ProjectId::SEMAFORO );
	/** Instancia un semaforo ya creado */
	Semaforo ( const std::string& nombre, const char projectId = ProjectId::SEMAFORO);
	
	~Semaforo();
	
	void abrir( const std::string& nombre, const char projectId = ProjectId::SEMAFORO);
	void crear( const std::string& nombre, const int valorInicial, const char projectId = ProjectId::SEMAFORO);
	
	bool estaCreado() const;
	
	int p () const; // decrementa
	int v () const; // incrementa
	
	void eliminar ();
	void destruir ();
};

#endif /* SEMAFORO_H_ */
